
/**  
* @Title: JsonObjectUtil.java
* @Package com.utils.transtype
* @Description: 
* @author likai
* @date 2017年4月23日
* @version V1.0  
*/

package com.utils.transtype;

import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
import org.codehaus.jackson.type.JavaType;


/**
 * @ClassName: JsonObjectUtil(推荐使用的json工具，性能较好)
 * @Description: json对象相互转换，使用jackson
 * @author likai
 * @date 2016年8月31日
 * @url http://www.tuicool.com/articles/2qUvuuz
 *
 */
public class JsonObjectUtil {
	private final ObjectMapper mapper = new ObjectMapper();
	// 默认，对象属性为""和null也参与序列化, MAP转换为JSON时候 值等于NULL的也参与
	public static final JsonObjectUtil ALWAYS = new JsonObjectUtil(Inclusion.ALWAYS, false);
	// 对象属性为 空（""） 或者为 NULL 都不序列化 , MAP转换为JSON时候 只转换值不等于NULL的
	public static final JsonObjectUtil NON_EMPTY = new JsonObjectUtil(Inclusion.NON_EMPTY, true);
	// 对象属性为默认值不序列化 , MAP转换为JSON时候 只转换值不等于NULL和默认的
	public static final JsonObjectUtil NON_DEFAULT = new JsonObjectUtil(Inclusion.NON_DEFAULT, true);
	// 对象属性为NULL 不序列化 , MAP转换为JSON时候 只转换值不等于NULL的
	public static final JsonObjectUtil NON_NULL = new JsonObjectUtil(Inclusion.NON_NULL, true);

	// 中文转义
	public static final JsonObjectUtil UNICODE = new JsonObjectUtil(Inclusion.ALWAYS, true, true);
	// 中文不转义
	public static final JsonObjectUtil NOUNICODE = new JsonObjectUtil(Inclusion.ALWAYS, false);

	public JsonObjectUtil(Inclusion inclusion, boolean WRITE_NULL_MAP_VALUES) {
		super();
		// 设置将对象转换成JSON字符串时候:包含的属性不能为空或"";
		mapper.setSerializationInclusion(inclusion);
		// -------------设置将 MAP转换为JSON时候 只转换值不等于NULL的------------------------ -
		mapper.configure(SerializationConfig.Feature.WRITE_NULL_MAP_VALUES, WRITE_NULL_MAP_VALUES);
		// mapper.configure(JsonGenerator.Feature.ESCAPE_NON_ASCII,
		// true);//设置序列化 ,中文unicode显示
		// 属性为日期类型数据格式化类型
		mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
		// 设置有属性不能映射成PO时不报错
		mapper.disable(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES);
	}

	public JsonObjectUtil(Inclusion inclusion, boolean WRITE_NULL_MAP_VALUES, boolean unicode) {
		super();
		// 设置将对象转换成JSON字符串时候:包含的属性不能为空或"";
		mapper.setSerializationInclusion(inclusion);
		// -------------设置将 MAP转换为JSON时候 只转换值不等于NULL的------------------------ -
		mapper.configure(SerializationConfig.Feature.WRITE_NULL_MAP_VALUES, WRITE_NULL_MAP_VALUES);
		if (unicode) {
			mapper.configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, true);// 设置序列化
																			// ,中文unicode显示
		}
		// 属性为日期类型数据格式化类型
		mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
		// 设置有属性不能映射成PO时不报错
		mapper.disable(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES);
	}

	/**
	 * 对象转为json字符串
	 * 
	 * @param arr
	 * @return
	 */
	public String objectToJson(Object object) throws Exception {
		return mapper.writeValueAsString(object);
	}

	/**
	 * json字符串转为对象
	 * 
	 * @param arr
	 * @return
	 */
	public <T> T jsonToObject(String json, Class<T> classType) throws Exception {
		return mapper.readValue(json, classType);
	}
	/**
	 * json字符串转为对象集合
	 * 
	 * @param arr
	 * @return
	 */
	public <T> List<T> jsonToObjectList(String json, Class<T> classType) throws Exception {
		JavaType javaType =mapper.getTypeFactory().constructParametricType(List.class, classType); 
		List<T> objectList =  mapper.readValue(json, javaType);   //这里不需要强制转换
		return objectList;
	}

	/**
	 * map转为对象
	 * 
	 * @param arr
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public <T> T mapToObject(Map map, Class<T> classType) throws Exception {
		String json = objectToJson(map);
		return mapper.readValue(json, classType);
	}

	/**
	 * 对象转map
	 * 
	 * @param arr
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public Map<String, Object> beanToMap(Object object) throws Exception {
		String json = objectToJson(object);
		Map<String, Object> map = jsonToObject(json, Map.class);
		return map;
	}
	
	/**
	 * 对象转对象
	 * 
	 * @param arr
	 * @return
	 */
	public <T> T beanToBean(Object object,Class<T> classType) throws Exception {
		String json = objectToJson(object);
		T bean = jsonToObject(json, classType);
		return bean;
	}

	@SuppressWarnings("rawtypes")
	public static void main(String[] args) throws Exception {
		String json="[{\"storeId\":\"1\",\"skus\":[{\"skuId\":\"1\"},{\"skuId\":\"1\"}]},{\"storeId\":\"1\",\"skus\":[{\"skuId\":\"1\"},{\"skuId\":\"1\"}]}]";
		List<HashMap> result=JsonObjectUtil.ALWAYS.jsonToObjectList(json, HashMap.class);
		System.out.println(result);
	}

}